import java.util.ArrayList;
import java.util.List;

public class mian {
    public static void main(String[] args) {
        // 初始化共享计数器，初始值为1000
        int[] count = new int[]{1000};
        // 创建线程列表，用于管理所有测试线程
        List<Thread> threads = new ArrayList<>();
        // 创建自定义锁实例
        fairLock lock = new fairLock();
        
        // 创建1000个线程，每个线程都会对共享计数器减1
        for (int i = 0; i < 1000; i++) {
            threads.add(new Thread(() -> {
                // 获取锁
                lock.lock();
                // 临界区：对共享计数器减1
                count[0]--;
                // 释放锁
                lock.unlock();
            }));
        }
        
        // 启动所有线程
        threads.forEach(Thread::start);
        /*这个lambda表达式表示
        for(Thread thread:threads){
            thread.start();
        }
        * */
        
        // 等待所有线程执行完成
        threads.forEach(thread -> {
            try {
                /*
                当一个线程（如主线程）调用另一个线程（如工作线程）的 join() 方法时
                调用线程会被阻塞，直到被调用的线程执行完毕
                这确保了线程执行的顺序性和结果的可见性*/
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
        // 输出最终计数器的值，验证锁的正确性
        System.out.println(count[0]);
    }
}
